home *** CD-ROM | disk | FTP | other *** search
- Aus 'ST-Computer', Ausgabe 3/92: 'Druckeransteuerung via GDOS'
-
- Das GFA-BASIC ab der Version 3.x verfügt im Prinzip über alle nötigen Funktio-
- nen für den Umgang mit GDOS. Solange man seine Schriften nur auf dem Bild-
- schirm ausgibt, stellen sich auch keine Probleme. Interessant wird es aber,
- wenn man versucht, auch seinem Drucker GDOS-Qualität zukommen zu lassen.
- Hier stößt man gleich auf mehrere Schwierigkeiten...
-
- Problematisch: Welche GDOS-Version muß es sein?
- GFA-BASIC steuert nur die GDOS-Versionen 1.x korrekt an, neuere Versionen wie
- z.B. AMC-GDOS führen zum Absturz. Das ist umso ärgerlicher, da viele Program-
- me (z.B. GEMINI, INTERFACE, TURBO-C) die Arbeit mit den alten GDOS-Versionen
- strikt ablehnen, was aufgrund der Fehleranfälligkeit auch zu verstehen ist.
-
- Das Scheitern der BASIC-Ansteuerung liegt wahrscheinlich in der fehlenden
- Handle-Übergabe beim Aufruf der VDI-Routinen. Die neueren GDOS-Versionen
- erwarten das Gerätehandle immer in CONTRL(6), was das BASIC wohl vernachläs-
- sigt. Das führt dazu, das alle VDI-Aufrufe wie TEXT oder PLOT auf den
- Bildschirm bezogen werden.
-
- Ausgespielt: Der DEFTEXT-Befehl.
- Zeichensatz und Größe stellt man normalerweise über den Befehl 'DEFTEXT
- farbe,stil,winkel,höhe,font' ein.
- Vielleicht haben Sie sich schon einmal gefragt, warum dieser Befehl so eigen-
- artige Werte als Größenangabe erwartet. Warum z.B. 13 für die normale System-
- schrift, die doch eigentlich 16 Pixel hoch ist?
- Der Grund liegt in der Unterscheidung zwischen ZELLEN- und ZEICHENGRÖßE.
- Die Zeichenzelle gibt das Raster an, in dem der Zeichensatz erstellt werden
- kann, also 8*16 beim Systemfont. Die Zeichengröße dagegen sagt aus, wieviele
- Rasterpunkte tatsächlich belegt sind, also nur 7*13 beim Systemfont.
-
- DEFTEXT erwartet nun also die tatsächliche ZEICHENHÖHE in Pixeln, was sich
- bereits bei unbekannten BILDSCHIRM-Zeichensätzen als problematisch erweist.
- Bei der Drucker-Ansteuerung zeigt sich DEFTEXT aber von einer Seite, die man
- hinter seinem biederen Erscheinungsbild nicht vermuten würde:
- Zunächst hat ein Zeichen auf dem Drucker natürlich ganz andere Ausmaße, so
- daß die Pixelangabe viel zu ungenau ist. Aber damit könnte man noch leben,
- wenn nicht je nach Art und Anzahl der geladenen Zeichensätze immer andere Er-
- gebnisse auf dem Drucker erscheinen, als man erwarteten dürfte. Teilweise muß
- man den Befehl zweimal hintereinander ausführen, damit er wirksam wird. Die
- tatsächlich eingestellte Größe der Zeichen scheint hier von allem möglichen
- beeinflußt zu werden, nur nicht von DEFTEXT.
-
- Dieser Befehl führt also auf Bildschirm und Drucker zu unterschiedlichen Er-
- gebnissen und ist daher für unsere Zwecke nicht zu gebrauchen.
-
- Die Lösung: VDI-Routinen im Eigenbau.
- GFA-BASIC gewährt uns den einfachen und C-kompatiblen Zugriff auf sämtliche
- VDI-Routinen. Also schreiben wir die von uns benötigten Funktionen mit kor-
- rekter Handle-Übergabe selbst (Quelle 2).
- Da wir klugerweise bei dieser Gelegenheit auch die Routinen VST_FONT() und
- VST_POINT() implementieren, können wir auf den DEFTEXT Befehl ganz
- verzichten.
- Über VST_FONT() legen wir den Zeichensatz fest (entspricht dem 5. DEFTEXT
- Parameter), VST_POINT() stellt die Zeichenhöhe in POINT ein. Point ist ein
- Satzmaß (ca. 0,353 mm) und findet häufig bei der Größenangabe von Zeichensät-
- zen Verwendung. Auch im Dateinamen eines GDOS-Fonts ist diese Angabe immer
- enthalten (z.B. 'ATTP10.FNT').
- VST_POINT() hat als Rückgabewert die tatsächlich eingestellte Textgröße,
- da die gewünschte Höhe ja nicht unbedingt im Zeichensatz vorgesehen ist.
- Außerdem werden noch die Zeichen- und Zellenausmaße des eingestellten Zei-
- chensatzes geliefert.
-
- Da wir den DEFTEXT-Befehl durch die VST_POINT()-Funktion ersetzen, erhalten
- wir sowohl für den Bildschirm als auch den Drucker die gleichen Textgrößen
- und müssen uns nicht mit der leidigen Pixelangabe herumschlagen.
-
- Ersatz für den TEXT-Befehl: V_JUSTIFIED()
- Den TEXT-Befehl des GFA-BASIC ersetzen wir durch V_JUSTIFIED(). Da diese
- Funktion ein paar mehr Parameter als das GFA-Pendant erwartet, gibt es zur
- Vereinfachung die Prozedur text, die den Funktionsaufruf enthält (Zeile 345).
- Die zusätzlichen Parameter beziehen sich auf die Ausrichtung des Textes, die
- in ähnlicher Form auch dem GFA-Befehl 'TEXT x&,y&,l&,a$' übergeben werden
- können. Der 3. Parameter liegt hierbei die Länge der Textausgabe fest.
- Auf diese Weise kann ein Text ohne große Mühe, und ohne direkt verändert zu
- werden, im Blocksatz ausgegeben werden. Dies geschieht bei l&>0 über die Ver-
- änderung des Zeichenabstandes oder durch die Veränderung des Wortabstandes
- bei l&<0 (Quelle 1).
- Bei unserer Implementation V_JUSTIFIED() ist diese Angabe auf 3 Parameter
- verteilt. Hier kann für den Zeichen- und Wortabstand getrennt angegeben
- werden, ob eine Dehnung stattfinden soll (>0) oder nicht (=0).
-
- Unverzichtbar: Das Gerätehandle
- Unsere selbstgeschriebenen VDI-Funktionen erwarten als ersten Parameter
- immer das Gerätehandle. Für den Bildschirm übergeben wir hier V~H, eine
- BASIC-Variable, die das bei Programmstart ermittelte Bildschirm-Handle
- enthält. Für den Drucker erhalten wir das Handle über V_OPNWK() (Zeile 101).
- V_OPNWK() ist übrigens der einzige GFA-GDOS-Befehl, den wir für die Drucker-
- ausgabe verwenden können, alle anderen müssen ersetzt werden.
-
- Nun können wir, wie es auch im Sinne des VDI ist, Bildschirm und Drucker
- mit denselben Befehlen ansprechen.
-
- So geht's: Das Listing.
- Das vorliegende Programm lädt die verfügbaren Zeichensätze und gibt sie mit
- den gleichen Funktionen zunächst auf dem Bildschirm und dann auf dem Drucker
- aus.
- Die folgende Beschreibung gilt daher sowohl für die Bildschirm- als auch die
- Druckerausgabe. Für den Bildschirm muß allerdings keine Workstation geöffnet
- (und am Ende wieder geschloßen) werden, da dies bereits beim Start des
- GFA-BASIC geschieht.
-
- Speicherreservierung über RESERVE.
- Für das Öffnen der Drucker-Workstation und das Laden der Zeichensätze wird
- eine ganze Menge Speicher benötigt. Wieviel genau, ist von der Auflösung
- Ihres Druckers und der Anzahl der Zeichensätze abhängig (beim FX85 z.B. ca.
- 400 KB, beim ATARI LASER 1,5 MB).
- Über RESERVE wird zunächst der BASIC-Speicher eingeschränkt und dem System
- überlassen. Ein beliebter Anfängerfehler besteht darin, hier einen Wert zu
- verwenden, der nicht durch 256 teilbar ist, was dann bei der Freigabe meist
- zum 'Fehler bei RESERVE...' führt.
-
- 'Workstation öffne dich...'
- Dann öffnen wir für den Drucker eine Workstation über V_OPNWK() und erhalten
- das Handle zurück, über das wir dieses Gerät von nun an ansprechen können.
- Aus dem INTOUT()-Feld können wir diverse Informationen über die Workstation
- auslesen. INTOUT(0) und INTOUT(1) z.B. geben die Auflösung des Gerätes in
- Pixeln an. Die Felder müssen unmittelbar nach dem V_OPNWK()-Aufruf ausgelesen
- werden, da sie sonst durch andere Werte überschrieben werden.
- In C werden diese Informationen normalerweise aus dem GEM WORK_OUT()-Feld
- gelesen. Auch im GFA-BASIC existiert dieses Feld. Allerdings enthält es IMMER
- die Parameter, die der V_OPNVWK()-Aufruf beim Start des GFA-BASIC für den
- BILDSCHIRM ergeben hat. Diese Tatsache geht aus dem BASIC-Handbuch nicht klar
- hervor und ist sicherlich für den Anfänger zunächst verwirrend.
-
- Das Laden der Zeichensätze.
- Die Zeichensätze werden über ~VST_LOAD_FONTS() geladen bzw. verfügbar ge-
- macht. Nun ermitteln wir die vorhandenen Zeichensätze und ihren Index mittels
- VQT_NAME(). Nur über diesen Index können wir die Fonts später ansprechen.
- Jede Schriftenfamilie hat einen eigenen Index, SWISS z.B. hat die Nummer 2.
- ~VST_LOAD_FONTS() lädt verständlicherweise auch immer nur einen Vertreter
- dieser Familie. Möchten Sie also mehrere Zeichensätze einer Familie (z.B:
- SWISS, EPSON SWISS und IBM SWISS) gleichzeitig installieren, um sie besser
- vergleichen zu können, so würde nur der als erster im ASSIGN.SYS eingetrage-
- ne Zeichensatz geladen werden.
- Wenn Sie allerdings wissen, daß der Fontindex im ersten Wort des Zeichensatz-
- headers steht, so können Sie diesen Wert PROVISORISCH mit einem geeigneten
- Texteditor (Tempus, Mortimer) ändern.
-
- Welche Pointgrößen gibt es?
- Zur Ermittlung der vorhandenen Pointgrößen wäre es am besten, sich über die
- sogenannte FONT-RING-LISTE durch die Header der einzelnen Zeichensätze zu
- hangeln. Hierzu müßten wir aber eine LINE_A-Variable benutzen, weshalb wir
- auf diese Möglichkeit verzichten und stattdessen folgende anwenden:
- Die Funktion VST_POINT() liefert die tatsächlich eingestellte Pointgröße zu-
- rück. In der Prozedur point_groessen (Zeile 145) gehen wir nun alle Zeichen-
- sätze durch, probieren alle möglichen Höhen aus und tragen die tatsächlich
- eingestellten Größen im String s_point$() bzw. p_point$() ein.
- Der Nachteil dieser Methode: Da der ROM-Bildschirmtreiber Zeichensätze auf
- die doppelte Größe skalieren kann, werden auch Höhen zurückgegeben, die
- nicht als eigener Zeichensatz existieren. Die Qualität dieser vergrößerten
- Schriften läßt meist zu wünschen übrig.
-
- Wir wissen nun, welche Zeichensätze es gibt und in welchen Größen wir sie
- ausgeben können.
-
- Die Ausgabe kann beginnen.
- Nun stellen wir mittels VST_FONT() den gewünschten Zeichensatz und über
- VST_POINT() seine Größe ein und geben die Texte über V_JUSTIFIED() aus. Bei
- der Bildschirmausgabe erscheinen die Schriften sofort, beim Drucker werden
- sie zunächst in einem internen Puffer (Display-List) gespeichert und erst
- über V_UPDWK() ausgedruckt.
-
- Danach entfernen wir die Fonts über VST_UNLOAD_FONTS(), schließen die Druk-
- ker-Workstation mit V_CLSWK() und geben den reservierten Speicher wieder
- frei.
-
- Nachsatz zur Klärung.
- Die im Text genannten Probleme mit den GFA-Befehlen beziehen sich lediglich
- auf die DRUCKER-Ansteuerung. Solange Sie Ihre Ausgaben nur auf dem Bildschirm
- tätigen, können Sie sowohl neuere GDOS-Versionen als auch die GFA-eigenen
- Funktionen (TEXT, DEFTEXT, VST_LOAD_FONTS() usw.) verwenden.
- Allerdings ist auch hier der Ersatz von DEFTEXT durch VST_POINT() zur Ein-
- stellung der Fontgröße sinnvoll, da so eine wesentlich präzisere Größenangabe
- möglich ist.
-
- Quellenangaben:
- 1. GFA-BASIC 3.0 Handbuch,
- GFA-Systemtechnik GmbH
- 2. ATARI ST/STE/TT-Profibuch,
- 10. Auflage, Sybex Verlag
-
- Gregor Duchalski
-